 const mysql = require('mysql');

 let pool = null;

  /**
  * 数据模型的基类,封装类数据库的常用操作
  */
module.exports = class Model {    

    static creatPool() {//连接连接池方法

        if(!pool){
            pool = mysql.createPool({//创建连接池
                connectionLimit : 10,
                host: '127.0.0.1',
                user: 'root',
                password: '072731',
                database: 'node_sale',
                useConnectionPooling: true  //使用连接池
            });
            console.log('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~创建连接池成功~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~');
        } else {
            console.log('~~~~!!!!~~~~!!!!~~~~连接池已经存在~~~~!!!!~~~~!!!!~~~~');
        }

    }

    /**
     * 封装的sql方法
     * @param {string} sql ,执行的sql语句
     * @param {*} args ,给sql语句进行赋值的参数数组
     * @returns {Promise<sql执行>}
     */
    static dbQuery(sql,args = []) {

        return new Promise ((resolve , reject) => { //同步化

            this.creatPool();//调用静态函数创建连接池
            pool.getConnection(function(err, connection) {  //连接池获取连接
                
                if (err) {//连接池失败
                    console.log('！！！！！！！！！！！！！！！！！mysql 连接池获取连接失败:' + err+'！！！！！！！！！！！！！！！！！');
                    pool.releaseConnection(connection);
                    return ;
                } else {//否则，即连接池获取成功
                    console.log('~~~~~~~~~~~~~~连接池成功获取连接~~~~~~~~~~~~~~~');

                    connection.query(sql,args,(error,results) => {
                        if(error) {//执行sql失败，外界通过catch方法执行
                            reject(error);
                        } else {//执行sql成功，外界通过then()方法执行
                            resolve(results);
                        }
                    });
                    
                }
                pool.releaseConnection(connection); //连接池释放连接
                console.log('~~~~~~~~~~~~~~连接池成功释放连接~~~~~~~~~~~~~~~');
                console.log();
                console.log();
                console.log();

            });
        });

    }



    /**关闭连接(硬链接方式) */
    /*static end() {
        if( null != conn) {//如果conn对象不为空
            conn.end();
            console.log('关闭连接成功......')
        }
    }*/


}